﻿using System.Diagnostics;

namespace CSharpNewFeatures
{
    public class CsharpDemoBase
    {
        public void print(object s)
        {
            StackFrame? st = new StackTrace(0, true)?.GetFrame(1);
            string methodName = st?.GetMethod()?.Name ?? "unknown";

            //foreach (var item in new StackTrace(0, true).GetFrames())
            //    Console.WriteLine(item.GetMethod());
            

            Console.WriteLine($"{DateTime.Now:yyyy/MM/dd HH:mm:ss.fff} {1000+Thread.CurrentThread.ManagedThreadId, -6} {methodName, -32} {s}");
        }


        public void printTitle(string s) => Console.WriteLine($"============= {s} =============");

        public virtual void Run()
        {

        }

        /// <summary>
        /// 返回当前线程ID和名称。
        /// </summary>
        /// <returns></returns>
        public string GetThreadInfo()
        {
            return String.IsNullOrEmpty(Thread.CurrentThread.Name) ?
                $"Thread(ID={1000+Thread.CurrentThread.ManagedThreadId})" :
                $"Thread(ID={1000+Thread.CurrentThread.ManagedThreadId}, Name={Thread.CurrentThread.Name})";
        }

        /// <summary>
        /// 获得调用函数的类名和方法。
        /// </summary>
        /// <returns></returns>
        public static string TraceMethodInfo()
        {
            // 注意：StackTrace的参数1非常重要，表示获得父一级函数调用的相关信息。
            // 如果修改为0，则返回本身的行列信息，即TraceMethodInfo()函数的信息。
            StackFrame? st = new StackTrace(1, true)?.GetFrame(0);
            var methodName = st?.GetMethod()?.Name ?? "unknown";                    // 方法名

            //string info = string.Format("{0}->{1}_{2}@{3}:{4}",
            //    // st.GetFileName(),                       // 文件名
            //    // st.GetMethod().DeclaringType.FullName,  // 类全名
            //    st.GetFileLineNumber(),                 // 所在行号
            //    st.GetFileColumnNumber());              // 所有列号
            return methodName;
        }

    }
}
